﻿using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Globalization;
using AudiPyme.BLL;
using System.IO;
using System.Data;
using AudiPyme.DAL;

namespace AudiPyme.UI
{
    public partial class RelacionesAddAmenContr : System.Web.UI.Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ModeloContainer agenteBD = new ModeloContainer();
                //Número de relaciones seleccionadas actualmente
                int nControlesOn = 0;
                //Cogemos el número total de Amenazas y Controles para dimensionar las estructuras acordes a ellas
                int numeroAmenazas = AmenazasFactory.AmenazasTotales();
                int numeroControles = ControlesFactory.ControlesTotales();
                //Lista de enteros que almacena que relación Control-Amenaza han sido seleccionadas
                int[,] Contador = new int[numeroControles,numeroAmenazas];
                //Inicializamos la matriz
                for (int i = 0; i < numeroControles; i++)
                {
                    for (int j = 0; j < numeroAmenazas; j++)
                    {
                        Contador[i,j] = 0;
                    }
                }
                //Recogemos las relaciones Amenaza-Control que hay en la BD y la volcamos en el GridView
                var labels = from m in agenteBD.Matriz_Amenazas_ControlesEstablecer
                             join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                             join c in agenteBD.ControlesEstablecer on m.IdControl equals c.IdControl
                             orderby c.IdControl, a.IdAmenaza
                             select new { c.IdControl, c.Nombre,a.IdAmenaza, a.Amenaza, c.Descripcion };
                GridView1.DataSource = labels;
                DataBind();
                //Inicializamos la estructura que va a almacenar los estados de las relaciones
                AmenContrCheck [,] CheckList = new AmenContrCheck[numeroControles,numeroAmenazas];
                for (int i = 0; i < numeroControles; i++)
                {
                    for (int j = 0; j < numeroAmenazas; j++)
                    {
                        CheckList[i,j] = new AmenContrCheck();
                    }
                }
                //Guardamos en variables de sesión
                Session["CheckList"] = CheckList;
                Session["Contador"] = Contador;
                Session["nControlesOn"] = nControlesOn;

                /* OTRA OPCIÓN A TENER EN CUENTA SI USAMOS VARIAS TABLAS EN UNA SENTENCIA SELECT
                var labels = from m in agenteBD.Matriz_Amenazas_ControlesEstablecer
                             from a in agenteBD.AmenazasEstablecer
                             .Where(v => v.IdAmenaza == m.IdAmenaza)
                             .DefaultIfEmpty()
                             from c in agenteBD.ControlesEstablecer
                             .Where(s => s.IdControl == m.IdControl)
                             .DefaultIfEmpty()
                             select new { c.IdControl, c.Nombre, a.Amenaza, c.Descripcion};
                */

            }

        }

        //Método que se ejecuta al evento de cliquear uno de los checkbox de cualquier relación de la tabla
        protected void CheckBox_Changued(Object sender, EventArgs e)
        {
            //Recuperamos las variables de sesión
            //Recogemos el valor de las relaciones seleccionadas en las otras paginas del GridView
            //con la variable de sesión nControlesOn
            int nControlesOn = (int)Session["nControlesOn"];
            int[,] Contador = (int[,])Session["Contador"];
            AmenContrCheck[,] CheckList = (AmenContrCheck[,])Session["Checklist"];
            //Recorremos la página que el gridview muestra
            foreach (GridViewRow row in GridView1.Rows)
            {
                //Recogemos el control CheckBox de cada fila del gridview
                CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                //Recogemos el Id del Control y el Id de la Amenaza de cada fila
                int IdControl;
                int.TryParse(GridView1.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                int IdAmenaza;
                int.TryParse(GridView1.Rows[row.RowIndex].Cells[3].Text, out IdAmenaza);
                //Si es la primera vez que se elige esa relación, aumentamos el contador
                //y marcamos que esa realción ya está elegida
                if (Chk.Checked == true && Contador[IdControl - 1,IdAmenaza-1]==0)
                {
                    if (nControlesOn == 0)
                    {
                        BtnInsertar.Enabled = true;
                    }
                    Contador[IdControl-1,IdAmenaza-1] = 1;
                    CheckList[IdControl - 1, IdAmenaza - 1].ValorCheck = true;
                    nControlesOn++;
                }
                //Sino marcamos que la relación no está elegida y actualizamos estructuras
                else if (Chk.Checked == false && Contador[IdControl - 1, IdAmenaza - 1] == 1)
                {
                    Contador[IdControl - 1, IdAmenaza - 1] = 0;
                    CheckList[IdControl - 1, IdAmenaza - 1].ValorCheck = false;
                    nControlesOn--;
                    if (nControlesOn == 0)
                    {
                        BtnInsertar.Enabled = false;
                    }
                }
            }
            //Actualizamos el número de controles elegidos en el label
            LblControl.Text = nControlesOn.ToString();
            //Guardamos en la variable de sesión
            Session["nControlesOn"] = nControlesOn;
        }


        protected void BntControl_Click(object sender, EventArgs e)
        {

        }

        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            //Recogemos el array que contiene las relaciones que han sido elegidas 
            int[,] Contador = (int[,])Session["Contador"];
            ArrayList valores = new ArrayList();
            //Recogemos el array tipado con el valor de las relaciones que han sido elegidas
            AmenContrCheck[,] CheckList = (AmenContrCheck[,])Session["Checklist"];
            //Recorremos el Gridview antes de cambiar de página
            foreach (GridViewRow row in GridView1.Rows)
            {
                //Recogemos el control CheckBox de cada fila
                CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                //Si está seleccionado
                if (Chk.Checked == true)
                {
                    //Recogemos el IdControl y el IdAmenaza de la fila
                    int IdControl;
                    int.TryParse(GridView1.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                    int IdAmenaza;
                    int.TryParse(GridView1.Rows[row.RowIndex].Cells[3].Text, out IdAmenaza);
                    //Actualizamos el valor de contador
                    Contador[IdControl - 1,IdAmenaza-1] = 1;
                    //
                    //
                    //VALOR CENTINELA DE EMPRESA: ACTUALIZAR!!!!!!!!!!
                    //
                    //
                    int IdEmpresaPrueba = 1;
                    //Recogemos el control
                    String Control = GridView1.Rows[row.RowIndex].Cells[3].Text;
                    //Creamos el objeto AmenContrCheck con los valores y lo insertamos en la lista
                    AmenContrCheck ControlChequeado = new AmenContrCheck(IdEmpresaPrueba,IdAmenaza,IdControl,true);
                    CheckList[IdControl-1,IdAmenaza-1]=ControlChequeado;
                }
                //Si no está seleccionado
                if (Chk.Checked == false)
                {
                    //Recogemos el IdControl e IdAmenaza de la fila
                    int IdControl;
                    int.TryParse(GridView1.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                    int IdAmenaza;
                    int.TryParse(GridView1.Rows[row.RowIndex].Cells[3].Text, out IdAmenaza);
                    //Actualizamos el valor de contador
                    Contador[IdControl - 1,IdAmenaza-1] = 0;
                    //
                    //
                    //VALOR CENTINELA DE EMPRESA: ACTUALIZAR!!!!!!!!!!
                    //
                    //
                    int IdEmpresaPrueba = 1;
                    //Recogemos el control y el valor seleccionado
                    String Control = GridView1.Rows[row.RowIndex].Cells[3].Text;
                    //Creamos el objeto AmenContrCheck con los valores y lo insertamos en la lista
                    AmenContrCheck ControlChequeado = new AmenContrCheck(IdEmpresaPrueba, IdAmenaza, IdControl, false);
                }
            }
            //Actualizamos la variable de sesión
            Session["Contador"] = Contador;
            this.GridView1.PageIndex = e.NewPageIndex;
            Session["CheckList"] = CheckList;
            ModeloContainer agenteBD = new ModeloContainer();
            var labels = from m in agenteBD.Matriz_Amenazas_ControlesEstablecer
                         join a in agenteBD.AmenazasEstablecer on m.IdAmenaza equals a.IdAmenaza
                         join c in agenteBD.ControlesEstablecer on m.IdControl equals c.IdControl
                         orderby c.IdControl, a.IdAmenaza
                         select new { c.IdControl, c.Nombre, a.IdAmenaza, a.Amenaza, c.Descripcion };
            /*
            var labels = from m in agenteBD.Matriz_Amenazas_ControlesEstablecer
                         from a in agenteBD.AmenazasEstablecer
                         .Where(v => v.IdAmenaza == m.IdAmenaza)
                         .DefaultIfEmpty()
                         from c in agenteBD.ControlesEstablecer
                         .Where(s => s.IdControl == m.IdControl)
                         .DefaultIfEmpty()
                         select new { c.IdControl, c.Nombre, a.Amenaza, c.Descripcion };
             * */
            GridView1.DataSource = labels;
            DataBind();
            //Cargamos el valor de las relaciones que estuvieran seleccionados anteriormente
            AmenContrCheck controlLista;
            int numeroAmenazas = AmenazasFactory.AmenazasTotales();
            int numeroControles = ControlesFactory.ControlesTotales();
            for (int i = 0; i < numeroControles; i++)
            {
                for (int j = 0; j < numeroAmenazas; j++)
                {
                    controlLista = CheckList[i, j];
                    foreach (GridViewRow row in GridView1.Rows)
                    {
                        int IdControl;
                        int.TryParse(GridView1.Rows[row.RowIndex].Cells[1].Text, out IdControl);
                        int IdAmenaza;
                        int.TryParse(GridView1.Rows[row.RowIndex].Cells[3].Text, out IdAmenaza);
                        if (IdControl == controlLista.IdControl && IdAmenaza == controlLista.IdAmenaza)
                        {
                            CheckBox Chk = (CheckBox)row.FindControl("CheckBox1");
                            if (controlLista.ValorCheck)
                            {
                                Chk.Checked = true;
                            }
                            else
                            {
                                Chk.Checked = false;
                            }
                        }
                    }
                }
            }
        }
    }

}